<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>What Is Relevance? | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="sorting.html" title="Sorting and Relevance">
<link rel="prev" href="multi-fields.html" title="String Sorting and Multifields">
<link rel="next" href="docvalues-intro.html" title="Doc Values Intro">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">Getting Started</a></span>
»
<span class="breadcrumb-link"><a href="sorting.html">Sorting and Relevance</a></span>
»
<span class="breadcrumb-node">What Is Relevance?</span>
</div>
<div class="navheader">
<span class="prev">
<a href="multi-fields.html">« String Sorting and Multifields</a>
</span>
<span class="next">
<a href="docvalues-intro.html">Doc Values Intro »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="relevance-intro"></a>What Is Relevance?<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/056_Sorting/90_What_is_relevance.asciidoc">edit</a>
</h2>
</div></div></div>
<p>We’ve mentioned that, by default, results are returned in descending order of
relevance. But what is relevance? How is it calculated?</p>
<p>The relevance score of each document is represented by a positive floating-point number called the <code class="literal">_score</code>. The higher the <code class="literal">_score</code>, the more relevant
the document.</p>
<p>A query clause generates a <code class="literal">_score</code> for each document.  How that score is
calculated depends on the type of query clause. Different query clauses are
used for different purposes: a <code class="literal">fuzzy</code> query might determine the <code class="literal">_score</code> by
calculating how similar the spelling of the found word is to the original
search term; a <code class="literal">terms</code> query would incorporate the percentage of terms that
were found. However, what we usually mean by <em>relevance</em> is the algorithm that we
use to calculate how similar the contents of a full-text field are to a full-text query string.</p>
<p>The standard <em>similarity algorithm</em> used in Elasticsearch is known as  <em>term
frequency/inverse document frequency</em>, or <em>TF/IDF</em>, which takes the following
factors into account:</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
Term frequency
</span>
</dt>
<dd>
 How often does the term appear in the field? The more often, the more
relevant. A field containing five mentions of the same term is more likely
to be relevant than a field containing just one mention.
</dd>
<dt>
<span class="term">
Inverse document frequency
</span>
</dt>
<dd>
 How often does each term appear in the index? The more often, the <em>less</em>
relevant. Terms that appear in many documents have a lower <em>weight</em> than
more-uncommon terms.
</dd>
<dt>
<span class="term">
Field-length norm
</span>
</dt>
<dd>
 How long is the field? The longer it is, the less likely it is that words in
the field will be relevant. A term appearing in a short <code class="literal">title</code> field
carries more weight than the same term appearing in a long <code class="literal">content</code> field.
</dd>
</dl>
</div>
<p>Individual queries may combine the TF/IDF score with other factors
such as the term proximity in phrase queries, or term similarity in
fuzzy queries.</p>
<p>Relevance is not just about full-text search, though. It can equally be applied
to yes/no clauses, where the more clauses that match, the higher the
<code class="literal">_score</code>.</p>
<p>When multiple query clauses are combined using a compound query like the
<code class="literal">bool</code> query, the <code class="literal">_score</code> from each of these query clauses is combined to
calculate the overall <code class="literal">_score</code> for the document.</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>We have a whole chapter dedicated to relevance calculations and how to
bend them to your will: <a class="xref" href="controlling-relevance.html" title="Controlling Relevance"><em>Controlling Relevance</em></a>.</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="explain"></a>Understanding the Score<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/056_Sorting/90_What_is_relevance.asciidoc">edit</a>
</h3>
</div></div></div>
<p>When debugging a complex query, it can be difficult to understand
exactly how a <code class="literal">_score</code> has been calculated.  Elasticsearch
has the option of producing an <em>explanation</em> with every search result,
by setting the <code class="literal">explain</code> parameter to <code class="literal">true</code>.</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_search?explain <a id="CO29-1"></a><i class="conum" data-value="1"></i>
{
   "query"   : { "match" : { "tweet" : "honeymoon" }}
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/056_Sorting/90_Explain.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO29-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">explain</code> parameter adds an explanation of how the <code class="literal">_score</code> was
calculated to every result.</p>
</td>
</tr>
</table>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Adding <code class="literal">explain</code> produces a lot of output for every hit, which can look
overwhelming, but it is worth taking the time to understand what it all means.
Don’t worry if it doesn’t all make sense now; you can refer to this section
when you need it.  We’ll work through the output for one <code class="literal">hit</code> bit by bit.</p>
</div>
</div>
<p>First, we have the metadata that is returned on normal search requests:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "_index" :      "us",
    "_type" :       "tweet",
    "_id" :         "12",
    "_score" :      0.076713204,
    "_source" :     { ... trimmed ... },</pre>
</div>
<p>It adds information about the shard and the node that the document came from,
which is useful to know because term and document frequencies are calculated
per shard, rather than per index:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">    "_shard" :      1,
    "_node" :       "mzIVYCsqSWCG_M_ZffSs9Q",</pre>
</div>
<p>Then it provides the <code class="literal">_explanation</code>. Each entry contains a  <code class="literal">description</code>
that tells you what type of calculation is being performed, a <code class="literal">value</code>
that gives you the result of the calculation, and the <code class="literal">details</code> of any
subcalculations that were required:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"_explanation": { <a id="CO30-1"></a><i class="conum" data-value="1"></i>
   "description": "weight(tweet:honeymoon in 0)
                  [PerFieldSimilarity], result of:",
   "value":       0.076713204,
   "details": [
      {
         "description": "fieldWeight in 0, product of:",
         "value":       0.076713204,
         "details": [
            {  <a id="CO30-2"></a><i class="conum" data-value="2"></i>
               "description": "tf(freq=1.0), with freq of:",
               "value":       1,
               "details": [
                  {
                     "description": "termFreq=1.0",
                     "value":       1
                  }
               ]
            },
            { <a id="CO30-3"></a><i class="conum" data-value="3"></i>
               "description": "idf(docFreq=1, maxDocs=1)",
               "value":       0.30685282
            },
            { <a id="CO30-4"></a><i class="conum" data-value="4"></i>
               "description": "fieldNorm(doc=0)",
               "value":        0.25,
            }
         ]
      }
   ]
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO30-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Summary of the score calculation for <code class="literal">honeymoon</code></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO30-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>Term frequency</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO30-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>Inverse document frequency</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO30-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p>Field-length norm</p>
</td>
</tr>
</table>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>Producing the <code class="literal">explain</code> output is expensive. It is a debugging tool
only. Don’t leave it turned on in production.</p>
</div>
</div>
<p>The first part is the summary of the calculation. It tells us that it has
calculated the <em>weight</em>—the TF/IDF—​of the term <code class="literal">honeymoon</code> in the field <code class="literal">tweet</code>, for document <code class="literal">0</code>.  (This is
an internal document ID and, for our purposes, can be ignored.)</p>
<p>It then provides details of how the weight was calculated:</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
Term frequency
</span>
</dt>
<dd>
How many times did the term <code class="literal">honeymoon</code> appear in the <code class="literal">tweet</code> field in
this document?
</dd>
<dt>
<span class="term">
Inverse document frequency
</span>
</dt>
<dd>
How many times did the term <code class="literal">honeymoon</code> appear in the <code class="literal">tweet</code> field
of all documents in the index?
</dd>
<dt>
<span class="term">
Field-length norm
</span>
</dt>
<dd>
How long is the <code class="literal">tweet</code> field in this document? The longer the field,
the smaller this number.
</dd>
</dl>
</div>
<p>Explanations for more-complicated queries can appear to be very complex, but
really they just contain more of the same calculations that appear in the
preceding example. This information can be invaluable for debugging why search
results appear in the order that they do.</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>The output from <code class="literal">explain</code> can be difficult to read in JSON, but it is easier
when it is formatted as YAML. Just add <code class="literal">format=yaml</code> to the query string.</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="explain-api"></a>Understanding Why a Document Matched<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/056_Sorting/90_What_is_relevance.asciidoc">edit</a>
</h3>
</div></div></div>
<p>While the <code class="literal">explain</code> option adds an explanation for every result, you can use
the <code class="literal">explain</code> API to understand why one particular document matched or, more
important, why it <em>didn’t</em> match.</p>
<p>The path for the request is <code class="literal">/index/type/id/_explain</code>, as in the following:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /us/tweet/12/_explain
{
   "query" : {
      "bool" : {
         "filter" : { "term" :  { "user_id" : 2           }},
         "must" :  { "match" : { "tweet" :   "honeymoon" }}
      }
   }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/056_Sorting/90_Explain_API.json"></div>
<p>Along with the full explanation that we saw previously, we also now have a
<code class="literal">description</code> element, which tells us this:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"failure to match filter: cache(user_id:[2 TO 2])"</pre>
</div>
<p>In other words, our <code class="literal">user_id</code> filter clause is preventing the document from
matching.</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="multi-fields.html">« String Sorting and Multifields</a>
</span>
<span class="next">
<a href="docvalues-intro.html">Doc Values Intro »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
